/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import modelo.total;
import modelo.equipo;
import org.jgap.Chromosome;
import org.jgap.Configuration;
import org.jgap.DefaultFitnessEvaluator;
import org.jgap.Gene;
import org.jgap.Genotype;
import org.jgap.IChromosome;
import org.jgap.impl.DefaultConfiguration;
import org.jgap.impl.IntegerGene;
import org.jgap.impl.SwappingMutationOperator;

/**
 *
 * @author Edgar
 */



//Clase de prueba
public class TestEquipoFitness {
    DAOEquipo listaE =new DAOEquipo();
    total ww=new total();
    //configuración de JGAP
    private Configuration conf;
    //SwappingMutationOperator -->Operador de intercambio de mutaciones
    private SwappingMutationOperator swapper;
    //Le indicamos a JGAP cual sera nuestra funcion de aptitud
    private EquipoFitnessFuncion fitnessFunction = null;
    public ArrayList <total> equipos  = new ArrayList<total>();
    public ArrayList <String> nombres = new ArrayList <String>();

    //Valor máximo permitido de evoluciones 
    private static final int MAX_ALLOWED_EVOLUTIONS = 100;
    private Chromosome movieChromosome = null;
    public void inicializar() throws Exception {   
        equipos=listaE.scoreEquipos();
        nombres=listaE.leerScore();
        //movies = this.loadMovies();

        conf = new DefaultConfiguration();
//        Configuration.resetProperty(Configuration.PROPERTY_FITEVAL_INST);
//        conf.setFitnessEvaluator(new DefaultFitnessEvaluator());
//        conf.getGeneticOperators().clear();

        swapper = new SwappingMutationOperator(conf);
        conf.addGeneticOperator(swapper);
        conf.setPreservFittestIndividual(true);
        conf.setPopulationSize(32);
        conf.setKeepPopulationSizeConstant(false);

        fitnessFunction = new EquipoFitnessFuncion(equipos, nombres);

        conf.setFitnessFunction(fitnessFunction);

        Gene[] movieGenes = new Gene[4];

        //IntegerGene(Configuración,Límites inferiores,Límites superiores);
        movieGenes[0] = new IntegerGene(conf, 0, equipos.size() - 1);
        movieGenes[1] = new IntegerGene(conf, 0, equipos.size() - 1);
        movieGenes[2] = new IntegerGene(conf, 0, equipos.size() - 1);
        movieGenes[3] = new IntegerGene(conf, 0, equipos.size() - 1);
        movieChromosome = new Chromosome(conf, movieGenes);
        movieGenes[0].setAllele(new Integer(0));
        movieGenes[1].setAllele(new Integer(1));
        movieGenes[2].setAllele(new Integer(2));
        movieGenes[3].setAllele(new Integer(3));
        conf.setSampleChromosome(movieChromosome);
    }
    //testSelectFittestMovies
    public String testSelectFittestMovies() throws Exception {
        equipos=listaE.scoreEquipos();
        Genotype population = Genotype.randomInitialGenotype(conf);

        IChromosome bestSolutionSoFar = movieChromosome;

        for (int i = 0; i < MAX_ALLOWED_EVOLUTIONS; i++) {
            population.evolve();
            //getFittestChromosome--> obtener el cromosoma más apto
            IChromosome candidateBestSolution = population.getFittestChromosome();

            if (candidateBestSolution.getFitnessValue() > bestSolutionSoFar.getFitnessValue()) {
                bestSolutionSoFar = candidateBestSolution;
            }
        }
        return printSolution(bestSolutionSoFar, equipos);
    }

    public String printSolution(IChromosome solution, List equipos) {
        String yy="";
        for (int i = 0; i < solution.size(); i++) {
            int index = (Integer) solution.getGene(i).getAllele();
            total sel = (total) equipos.get(index);
            yy=yy.concat("Valor del Fitness: ") .concat(String.valueOf(solution.getFitnessValue())).concat(sel.toString()).concat("\n\n");
        }
        return yy;
    }
    
    //metodo para devolver el fitness
    public String llenar_consola() throws Exception {
        String cnsl="";
        equipos=listaE.scoreEquipos();
        Genotype population = Genotype.randomInitialGenotype(conf);

        IChromosome bestSolutionSoFar = movieChromosome;

        for (int i = 0; i < MAX_ALLOWED_EVOLUTIONS; i++) {
            population.evolve();
            IChromosome candidateBestSolution = population.getFittestChromosome();
                bestSolutionSoFar = candidateBestSolution;
                cnsl=cnsl.concat(printSolution(bestSolutionSoFar, equipos));
        }
        conf.reset();
        return cnsl;
    }
   
}
